home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / Snippets / Testing & Debugging / Audit / Src / AuditEntryFormat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-21  |  6.3 KB  |  254 lines  |  [TEXT/KAHL]

  1. /*                                AuditEntryFormat.c                                */
  2. /*
  3.  * AuditEntryFormat.c
  4.  * Copyright © 1992-93 Apple Computer Inc. All Rights Reserved.
  5.  * Programmed by Martin Minow,
  6.  *    Internet:    minow@apple.com
  7.  *    AppleLink:    MINOW
  8.  * Version of January 14, 1993
  9.  *
  10.  * Edit History
  11.  *    93.01.09 MM        First public release
  12.  *    93.07.09 MM        Reformatted for 80-column page. No substantive changes.
  13.  *
  14.  * Format an AuditEntryRecord. Note: there is no size checking, which
  15.  * means that if you somehow manage to create an extra-long record,
  16.  * you'll get garbage. The functions won't corrupt memory, however.
  17.  * result may not be an expression with side-effects.
  18.  */
  19. #include "Audit.h"
  20. #include <Memory.h>
  21. #include <OSUtils.h>
  22.  
  23. #define AppendChar(result, c) (result[++result[0]] = (c))
  24. static void        AppendUnsigned(StringPtr, unsigned long);
  25. static void        AppendSigned(StringPtr, signed long);
  26. static void        AppendUnsignedLeadingZeros(StringPtr, unsigned long, short, short);
  27. static void        AppendHexLeadingZeros(StringPtr, unsigned long, short);
  28. static void        AppendPascalString(StringPtr, const StringPtr);
  29. static void        AppendOSType(StringPtr, OSType);
  30.  
  31. enum {
  32.     NUL            = 0,
  33.     kOpenQuote    = 0xD2,
  34.     kCloseQuote    = 0xD3
  35. };
  36.  
  37. #define AUDIT    (*auditPtr)
  38. #define ENTRY    (*entryPtr)
  39.  
  40. /*
  41.  * FormatAuditEntryData() converts an audit record entry into readable text,
  42.  * storing the result in the Pascal string argument.
  43.  */
  44. void
  45. FormatAuditEntryData(
  46.         register AuditEntryPtr    entryPtr,
  47.         StringPtr                result
  48.     )
  49. {
  50.         unsigned long                datum;
  51.         unsigned long                format;
  52.         unsigned short                thisFormat;
  53.         register unsigned long        *dataPtr;
  54.         unsigned long                *dataEnd;
  55.         
  56.         result[0] = 0;
  57.         if (ENTRY.lostData != 0) {
  58.             AppendUnsigned(result, ENTRY.lostData);
  59.             AppendPascalString(result, "\p lost, ");
  60.         }
  61.         AppendOSType(result, ENTRY.idCode);
  62.         AppendPascalString(result, "\p: ");
  63.         format = ENTRY.format;
  64.         dataPtr = ENTRY.data;
  65.         dataEnd = &ENTRY.data[8];
  66.         while (dataPtr < dataEnd) {
  67.             thisFormat = (format & kAuditFormatMask);
  68.             format >>= kAuditFormatShift;
  69.             if (thisFormat == kAuditFormatEnd)
  70.                 break;
  71.             else if (thisFormat == kAuditFormatString) {
  72.                 if (dataPtr > &ENTRY.data[0])
  73.                     AppendChar(result, ' ');
  74.                 AppendChar(result, kOpenQuote);            /* Open double quote    */
  75.                 AppendPascalString(result, (StringPtr) dataPtr);
  76.                 AppendChar(result, kCloseQuote);
  77.                 break;                                    /* Exit loop            */
  78.             }
  79.             else if (thisFormat == kAuditFormatLocation) {
  80.                 if (dataPtr > &ENTRY.data[0])
  81.                     AppendChar(result, ' ');
  82.                 datum = *dataPtr++;                        /* Offset                */
  83.                 if (datum == 0 && dataPtr < dataEnd)
  84.                     AppendHexLeadingZeros(result, *dataPtr, 8);
  85.                 else {
  86.                     if (dataPtr < dataEnd)
  87.                         AppendPascalString(result, (StringPtr) dataPtr);
  88.                     AppendPascalString(result, "\p + 0x");
  89.                     AppendHexLeadingZeros(result, datum, 4);
  90.                 }
  91.                 break;                                    /* Exit loop            */
  92.             }
  93.             else {
  94.                 if (dataPtr > &ENTRY.data[0])
  95.                     AppendPascalString(result, "\p, ");
  96.                 datum = *dataPtr++;
  97.                 switch (thisFormat) {
  98.                 case kAuditFormatSigned:
  99.                     AppendSigned(result, (signed long) datum);
  100.                     break;
  101.                 case kAuditFormatUnsigned:
  102.                     AppendUnsigned(result, datum);
  103.                     break;
  104.                 case kAuditFormatHex:
  105.                     AppendHexLeadingZeros(result, datum, 8);
  106.                     AppendPascalString(result, "\p=");
  107.                     AppendOSType(result, datum);
  108.                     break;
  109.                 case kAuditFormatAddress:
  110.                 default:                        /* Unknown        */
  111.                     AppendHexLeadingZeros(result, datum, 8);
  112.                     break;
  113.                 }
  114.             }
  115.         }
  116. #undef DATA
  117. }
  118.  
  119. /*
  120.  * FormatAuditEntryTimestamp() converts an audit record entry's timestamp into
  121.  * readable text, storing the result in the Pascal string argument.
  122.  */
  123. void
  124. FormatAuditEntryTimestamp(
  125.         register AuditPtr        auditPtr,
  126.         register AuditEntryPtr    entryPtr,
  127.         StringPtr                result
  128.     )
  129. {
  130.         unsigned long            elapsedTicks;
  131.         unsigned long            timeNow;
  132.         DateTimeRec                dateTimeRec;
  133.         
  134.         result[0] = 0;
  135.         elapsedTicks = ENTRY.tickCount - AUDIT.ticksAtStart;
  136.         timeNow = AUDIT.timeAtStart + (elapsedTicks / 60L);
  137.         Secs2Date(timeNow, &dateTimeRec);
  138.         AppendUnsignedLeadingZeros(result, dateTimeRec.year,    4, '.');
  139.         AppendUnsignedLeadingZeros(result, dateTimeRec.month,    2, '.');
  140.         AppendUnsignedLeadingZeros(result, dateTimeRec.day,        2, ' ');
  141.         AppendUnsignedLeadingZeros(result, dateTimeRec.hour,    2, ':');
  142.         AppendUnsignedLeadingZeros(result, dateTimeRec.minute,    2, ':');
  143.         AppendUnsignedLeadingZeros(result, dateTimeRec.second,    2, '.');
  144.         elapsedTicks = ((elapsedTicks % 60L) * 1000L) / 60L;    /* Msec    */
  145.         AppendUnsignedLeadingZeros(result, elapsedTicks,        3, NUL);
  146. }
  147.  
  148. /*
  149.  * Output an n-digit decimal value with leading zeros.
  150.  */
  151. static void
  152. AppendUnsignedLeadingZeros(
  153.         StringPtr            result,
  154.         unsigned long        value,
  155.         short                digits,
  156.         short                terminator
  157.         
  158.     )
  159. {
  160.         if (--digits > 0)
  161.             AppendUnsignedLeadingZeros(result, value / 10, digits, NUL);
  162.         AppendChar(result, (value % 10) + '0');
  163.         if (terminator != NUL)
  164.             AppendChar(result, terminator);
  165. }
  166.  
  167. /*
  168.  * Output a signed decimal longword.
  169.  */
  170. static void
  171. AppendSigned(
  172.         StringPtr            result,
  173.         signed long            value
  174.     )
  175. {
  176.         if (value < 0) {
  177.             AppendChar(result, '-');
  178.             value = (-value);
  179.         }
  180.         AppendUnsigned(result, (unsigned long) value);
  181. }
  182.  
  183. /*
  184.  * Output an unsigned decimal longword.
  185.  */
  186. static void
  187. AppendUnsigned(
  188.         StringPtr            result,
  189.         unsigned long        value
  190.     )
  191. {
  192.         if (value >= 10)
  193.             AppendUnsigned(result, value / 10);
  194.         AppendChar(result, (value % 10) + '0');
  195. }
  196.  
  197. /*
  198.  * Output a string of hex digits with leading zeros.
  199.  */
  200. static void
  201. AppendHexLeadingZeros(
  202.         StringPtr            result,
  203.         unsigned long        value,
  204.         short                digits
  205.     )
  206. {
  207.         if (--digits > 0)
  208.             AppendHexLeadingZeros(result, value >> 4, digits);
  209.         value &= 0x0F;
  210.         AppendChar(result,
  211.                 (value < 10)
  212.                 ? value + '0'
  213.                 : (value + ('A' - 10))
  214.             );
  215. }
  216.  
  217. /*
  218.  * Output a 4-byte character string. Unknown
  219.  * bytes (characters outside the range ' ' to '~')
  220.  * are replaced as '.'.
  221.  */
  222. static void
  223. AppendOSType(
  224.         StringPtr                result,
  225.         OSType                    datum
  226.     )
  227. {
  228.         char                    value[sizeof (OSType)];
  229.         register short            i;
  230.         register unsigned char    c;
  231.         
  232.         BlockMove(&datum, value, sizeof (OSType));
  233.         AppendChar(result, '\'');
  234.         for (i = 0; i < sizeof (OSType); i++) {
  235.             c = value[i];
  236.             if (c < ' ' || c >= 0x7F)
  237.                 c = '.';
  238.             AppendChar(result, c);
  239.         }
  240.         AppendChar(result, '\'');
  241. }
  242.  
  243. static void
  244. AppendPascalString(
  245.         StringPtr                result,
  246.         const StringPtr            datum
  247.     )
  248. {
  249.         register short            i;
  250.         
  251.         for (i = 1; i <= datum[0]; i++)
  252.             AppendChar(result, datum[i]);
  253. }
  254.